package main

import "fmt"

/*
*
假设有两个方法，一个方法的接收者是指针类型，一个方法的接收者是值类型，那么：
对于值类型的变量和指针类型的变量，这两个方法有什么区别？
如果这两个方法是为了实现一个接口，那么这两个方法都可以调用吗？
如果方法是嵌入到其他结构体中的，那么上面两种情况又是怎样的？
*/

type user struct {
	name   string
	age    int
	gender string
}

func (u user) method1() {
	u.name = "Alice"
}

func (u *user) method2() {
	u.name = "Bob"
}

func main() {
	u := user{name: "zhangsan", age: 22, gender: "男"}
	fmt.Println(u.name)
	u.method1()
	fmt.Println(u.name)
	u.method2()
	fmt.Println(u.name)
}

/**

当调用t.method1()时相当于method1(t)，实参和行参都是类型 T，可以接受。此时在method1()中的t只是参数t的值拷贝，所以method1()的修改影响不到main中的t变量。

当调用t.method2()=>method2(t)，这是将 T 类型传给了 *T 类型，go可能会取 t 的地址传进去：method2(&t)。所以 method1() 的修改可以影响 t。

T 类型的变量这两个方法都是拥有的。

*/
